package com.audaque.springboot.foshanupload.web.webdemo.controller;

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author zgb
 * @desc ...
 * @date 2023-08-08 18:28:40
 */
@RestController
@RequestMapping("fileChannel")
public class FileChannelController {

    @PostMapping("readFile")
    public void readFile(@RequestParam String filePath) throws IOException {
        RandomAccessFile randomAccessFile = new RandomAccessFile(filePath, "rw"); // 获取一个随机读写文件的引用

        FileChannel inChannel = randomAccessFile.getChannel(); // 从文件引用中获取 channel，用于读取数据

        ByteBuffer buf = ByteBuffer.allocate(48);  // buffer是一块内存区域，限定每次取48字节

        int bytesRead = inChannel.read(buf); // 第一次从channel中读取到buffer，48字节

        while (bytesRead != -1) {  // 判断是否已到文件末尾
            System.out.println("Read:" + bytesRead);  // 打印读到的字节长度

            buf.flip(); // 翻转，这样可以从buffer中读取数据

            while (buf.hasRemaining()) {   // 当buffer中有数据时，循环，使用get读取单字节并且打印出来
                System.out.print((char) buf.get());  // 注意，get并不会取出数据，而只会读数据，然后offset后移一位
            }
            System.out.println(); // 换行

            buf.clear(); // clear掉buffer内容，不然无法继续读取新内容
            bytesRead = inChannel.read(buf); // 继续从文件中读取数据
        }

        randomAccessFile.close(); // 关闭文件



    }


}
